﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Text;
using System.Security.Cryptography;
using Microsoft.Security.Application;

#pragma warning disable 0618 // disable AntiXX is obsolete warning

public partial class Login : System.Web.UI.Page
{
    private SqlCommand cmd;
    private SqlDataReader reader;
    int sessionCount;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Hou bij hoevaak de gebruiker geprobeerd heeft in te loggen
        if (Session["Count"] == null)
        {
            sessionCount = 0;
        }
        else
        {
            sessionCount = Convert.ToInt32(Session["Count"]);
            if (sessionCount > 3)
            {
                txt_email.Enabled = false;
                txt_wachtwoord.Enabled = false;
                btn_login.Enabled = false;
                lbl_foutmelding.Text = "Login voor 5 minuten geblokkeerd";
            }
                
        }
        try
        {
            if(ConnectDB._Connection.State == ConnectionState.Open)
                ConnectDB._Connection.Close();
            ConnectDB._Connection.Open();

            cmd = new SqlCommand(sp.getBlokkeerIP, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter ipadresParm = cmd.Parameters.Add("@ipadres", SqlDbType.VarChar);

            ipadresParm.Value = Request.ServerVariables["REMOTE_ADDR"];
            DateTime datum = DateTime.Now;
            reader = cmd.ExecuteReader();
            read(reader);
        }
        catch (SqlException ex)
        {
            LogError.writeToLogFile(ex.Message);
        }
        finally
        {
            reader.Close();
            ConnectDB._Connection.Close();
        }

    }

    private void read(SqlDataReader reader)
    {
        if (reader.Read())
        {
            if (Request.ServerVariables["REMOTE_ADDR"] == reader["Ipadres"].ToString())
            {
                DateTime expireDate = (DateTime)reader["Datum"];
                TimeSpan elapsedTime = DateTime.Now.Subtract(expireDate);
                const int MIN_TIME = 4;

                if (elapsedTime.Minutes <= MIN_TIME && elapsedTime.Hours < 1)
                {
                    txt_email.Enabled = false;
                    txt_wachtwoord.Enabled = false;
                    btn_login.Enabled = false;
                }
                else
                {
                    txt_email.Enabled = true;
                    txt_wachtwoord.Enabled = true;
                    btn_login.Enabled = true;
                    lbl_foutmelding.Text = "";
                    try
                    {
                        if(ConnectDB._Connection.State == ConnectionState.Open)
                            ConnectDB._Connection.Close();
                        ConnectDB._Connection.Open();

                        cmd = new SqlCommand(sp.setDeleteBlokkeerIP, ConnectDB._Connection);
                        cmd.CommandType = CommandType.StoredProcedure;
                        SqlParameter ipadresParm2 = cmd.Parameters.Add("@ipadres", SqlDbType.VarChar);

                        ipadresParm2.Value = Request.ServerVariables["REMOTE_ADDR"];

                        cmd.ExecuteNonQuery();
                    }
                    catch(SqlException ex)
                    {
                        LogError.writeToLogFile(ex.Message);
                    }
                    finally
                    {
                        ConnectDB._Connection.Close();
                    }
                }
            }
        }
    }

    public void haalLoginGegevensOp()
    {
        // Controlleer of het e-mail adres aanwezig is in de database.
        try
        {

            cmd = new SqlCommand(sp.getPersoonFromEmail, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter eMail = cmd.Parameters.Add("@Emailadres", SqlDbType.VarChar);
            eMail.Value = txt_email.Text.Trim().ToLower();

            ConnectDB._Connection.Open();
            reader = cmd.ExecuteReader();
            printGegevens();
        }
        catch (SqlException e)
        {
            lbl_foutmelding.Text = Fout.databaseOffline;
            LogError.writeToLogFile(e.Message);
        }
        finally
        {
            reader.Close();
            ConnectDB._Connection.Close();
        }
    }

    public void printGegevens()
    {
        if (reader == null) //Als er geen waardes gevonden zijn, moet er een foutmelding gegeven worden en de textboxen geleegd worden ivm veiligheid
        {
            lbl_foutmelding.Text = Fout.foutieveInvoer;
            txt_email.Text = string.Empty;
            txt_wachtwoord.Text = string.Empty;

        }
        if (reader.Read())
        {
            string salt = reader["Salt"].ToString();
            string wijzigWachtwoord = reader["WijzigVerplicht"].ToString();

            // zet het ingevoerde wachtwoord om in een hash
            string wachtwoord = SHA.generateHash(txt_wachtwoord.Text.Trim(), salt);

            // controleer of de hash van het wachtwoord overeenkomt met de hash opgeslagen bij het ingevoerde email adress
            if (txt_email.Text.Trim().ToLower() == reader["Emailadres"].ToString() && wachtwoord == reader["Wachtwoord"].ToString())
            {

                string randomstring = RandomString.Generate(100);
                Response.Cookies["InHollandAir"]["1"] = randomstring;
                //   Response.Cookies["InHollandAir"].Secure = true;
                Response.Cookies["InHollandAir"].HttpOnly = true;
                string klantNr = reader["Klantnummer"].ToString();

                try
                {
                    if (ConnectDB._Connection.State == ConnectionState.Open)
                        ConnectDB._Connection.Close();
                    ConnectDB._Connection.Open();
                    cmd = new SqlCommand("sp_set_Session", ConnectDB._Connection);
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter klantnummer = cmd.Parameters.Add("@klantnummer", SqlDbType.VarChar);
                    SqlParameter sessionid = cmd.Parameters.Add("@sessionid", SqlDbType.VarChar);
                    klantnummer.Value = klantNr;
                    sessionid.Value = randomstring;
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    LogError.writeToLogFile(ex.Message);
                }
                finally
                {
                    ConnectDB._Connection.Close();
                }
                if (cb_onthouden.Checked == true)
                {
                    Response.Cookies["InHollandAir"].Expires = DateTime.Now.AddMonths(1); //Cookie 1 maand bewaren
                }
                LogError.writeToLogFile("Succesvol ingelogd klantnummer: " + klantNr);
                if (wijzigWachtwoord == "True")
                    Response.Redirect("WachtwoordWijzigen.aspx");
                else if (Session["HTTP_Referer"] == null)
                    Response.Redirect("GebruikerOverzicht.aspx");
                else
                    Response.Redirect(Session["HTTP_Referer"].ToString());
            }

            else
            {
                lbl_foutmelding.Text = Fout.foutieveInvoer;
                txt_email.Text = string.Empty;
                txt_wachtwoord.Text = string.Empty;
                LogError.writeToLogFile("Niet gelukte inlogpoging: Wachtwoord komt niet overeen met emailadres.");
            }
        }
        else
        {
            lbl_foutmelding.Text = Fout.foutieveInvoer;
            txt_email.Text = string.Empty;
            txt_wachtwoord.Text = string.Empty;
            LogError.writeToLogFile("Niet gelukte inlogpoging: SQLData.Reader niet uitgevoerd.");
        }

    }

    protected void btn_login_Click(object sender, EventArgs e)
    {
        sessionCount++;
        Session["Count"] = sessionCount;
        lbl_session.Text = ("Inlogpoging: " +sessionCount.ToString());
        if (sessionCount > 3)
        {
            txt_email.Enabled = false;
            txt_wachtwoord.Enabled = false;
            btn_login.Enabled = false;
            lbl_foutmelding.Text = "Login voor 5 minuten geblokkeerd.";
            try
            {
                if (ConnectDB._Connection.State == ConnectionState.Open)
                    ConnectDB._Connection.Close();

                ConnectDB._Connection.Open();
                cmd = new SqlCommand(sp.setBlokkeerIP, ConnectDB._Connection);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter ipadresParm2 = cmd.Parameters.Add("@ipadres", SqlDbType.VarChar);
                SqlParameter datumParm = cmd.Parameters.Add("@datum", SqlDbType.DateTime);
                ipadresParm2.Value = Request.ServerVariables["REMOTE_ADDR"];
                datumParm.Value = DateTime.Now;
                cmd.ExecuteNonQuery();
                LogError.writeToLogFile("Gebruiker 3x verkeerde inlogpogingen. Ipadres: " + Request.ServerVariables["REMOTE_ADDR"]);
            }
            catch (SqlException ex)
            {
                LogError.writeToLogFile(ex.Message);
            }
            finally
            {
                ConnectDB._Connection.Close();
            }
        }
        haalLoginGegevensOp();
    }
}